package ar.edu.unicen.exa.isistan.archassis;

import java.io.File;

import ar.edu.unicen.exa.isistan.archassis.rcs.IVersion;
import ar.edu.unicen.exa.isistan.archassis.rcs.RCSFileDiff;
import ar.edu.unicen.exa.isistan.archassis.util.MiscUtils;

/**
 * Administracion del directorio temporal.
 * 
 * Dentro de la carpeta actual (ver System.getProperties().get("user.dir")) se
 * crea un directorio llamado <code>/tmp/</code> ({@link DiffRequestData#TMPROOT}).
 * Dentro de ese directorio se crean los directorios rev_X y temp, dejando 
 * algo como esto:
 * <pre>
 * 		[directorio actual]
 * 			|---tmp
 * 			|    |---rev_1 (checkout del )
 * 			|    |---rev_8
 * 			|    |---temp
 * </pre>
 * 
 * @author sebastianperruolo@gmail.com
 *
 */
public class DiffRequestData {
	private static final String TMPROOT = "/tmp/";
	
	public static final File tempDir() {
		return new File(System.getProperties().get("user.dir") + TMPROOT); 
	}
	
	private String repositoryURL;
	//private String srcRelativePath;
/**
 * 
 */
	public DiffRequestData(String repositoryURL) {
		this.repositoryURL = repositoryURL;
	}
	
	/**
	 * URL para el repositorio SVN
	 * @return the repositoryURL
	 */
	public String getRepositoryURL() {
		return repositoryURL;
	}
	
	
	/** Path absoluto al directorio temporal */
	private File _tmpRoot = null;
	/**
	 * Retorna el directorio temporal.
	 * @return
	 */
	public File getRootTempPath() {
		if (_tmpRoot == null) {
			_tmpRoot = new File(tempDir(), 	//directorio temporal
					MiscUtils.plainFileName(repositoryURL)); 			//crea un nombre dada la url del repositorio
		}
		return returnDirectory(_tmpRoot);
	}
	
	/**
	 * Retorna el directorio temporal para una version dada.
	 * 
	 * @param v Version
	 * @return directorio temporal para esa version.
	 */
	public File getDestinationFor(IVersion v) {
		return returnDirectory(new File(getRootTempPath(), v.getID()));
	}
	
	private File getDestinationFor(IVersion v, String relPath) {
		return returnFile(new File(getDestinationFor(v), relPath));
	}
	
	public File getDestinationFor(IVersion v, RCSFileDiff fileDiff) {
		return getDestinationFor(v, fileDiff.getPath());
	}

//	public File getCodeDestinationFor(IVersion v) {
//		return returnDirectory(new File(getDestinationFor(v), srcRelativePath));
//	}

	
	private File _diffTempDir = null;
	public File getDiffTempDir() {
		if (_diffTempDir == null) {
			_diffTempDir = new File(getRootTempPath(), "temp");
			deleteDirectory(_diffTempDir);
			_diffTempDir.mkdirs();
		}
		return _diffTempDir;
		
	}

	private static File returnDirectory(File f) {
		if (! f.isDirectory()) {
			f.mkdirs();
		}
		return f;
	}
	private static File returnFile(File f) {
		if (! f.getParentFile().isDirectory()) {
			f.getParentFile().mkdirs();
		}
		return f;
	}


	private static boolean deleteDirectory(File path) {
		if( path.exists() ) {
			File[] files = path.listFiles();
			for(int i=0; i<files.length; i++) {
				if(files[i].isDirectory()) {
					deleteDirectory(files[i]);
				}
				else {
					files[i].delete();
				}
			}
		}
		return( path.delete() );
	}

}
